import { GameObject } from "./GameObject";
import { Wall } from "./Wall";
import { Snake } from "./Snake";

export class GameMap extends GameObject {
    constructor(ctx, parent, store) {
        super();

        this.ctx = ctx;
        this.parent = parent;
        this.store = store;
        this.L = 0;  // 每个格子的大小

        this.rows = 13;  // 地图的行数
        this.cols = 14;  // 地图的列数
        
        this.inner_walls_count = 20;  // 内部墙的数量
        this.walls = [];  // 存储墙的数组

        // 初始化两条蛇
        this.snakes=[
            new Snake({
                id:0,
                color:"#4876EC",  // 蛇1的颜色
                r:this.rows-2,  // 蛇1的初始行位置
                c:1,  // 蛇1的初始列位置
            },this),
            new Snake({
                id:1,
                color:"#F94848",  // 蛇2的颜色
                r:1,  // 蛇2的初始行位置
                c:this.cols-2,  // 蛇2的初始列位置
            },this),
        ]
    }

    // // 检查地图的连通性
    // check_connectivity(g, sx, sy, tx, ty) {
    //     if (sx == tx && sy == ty) return true;  // 如果起点和终点相同，返回true
    //     g[sx][sy] = true;  // 标记当前点为已访问

    //     let dx = [-1, 0, 1, 0], dy = [0, 1, 0, -1];  // 四个方向的移动
    //     for (let i = 0; i < 4; i ++ ) {
    //         let x = sx + dx[i], y = sy + dy[i];  // 计算下一个点的位置
    //         if (!g[x][y] && this.check_connectivity(g, x, y, tx, ty))  // 如果下一个点未访问且连通
    //             return true;
    //     }

    //     return false;  // 如果不连通，返回false
    // }

    // 创建墙
    create_walls() {
        const g = this.store.state.pk.gamemap;
        // const g = [];
        // for (let r = 0; r < this.rows; r ++ ) {
        //     g[r] = [];
        //     for (let c = 0; c < this.cols; c ++ ) {
        //         g[r][c] = false;  // 初始化地图，所有点为false
        //     }
        // }

        // // 给四周加上障碍物
        // for (let r = 0; r < this.rows; r ++ ) {
        //     g[r][0] = g[r][this.cols - 1] = true;  // 左右两侧的墙
        // }

        // for (let c = 0; c < this.cols; c ++ ) {
        //     g[0][c] = g[this.rows - 1][c] = true;  // 上下两侧的墙
        // }

        // // 创建随机障碍物
        // for (let i = 0; i < this.inner_walls_count / 2; i ++ ) {
        //     for (let j = 0; j < 1000; j ++ ) {
        //         let r = parseInt(Math.random() * this.rows);  // 随机行
        //         let c = parseInt(Math.random() * this.cols);  // 随机列
        //         if (g[r][c] || g[this.rows-1-r][this.cols-1-c]) continue;  // 如果该点已经有墙，跳过
        //         if (r == this.rows - 2 && c == 1 || r == 1 && c == this.cols - 2)  // 如果该点是蛇的起点，跳过
        //             continue;

        //         g[r][c] = g[this.rows-1-r][this.cols-1-c] = true;  // 对称放置墙
        //         break;
        //     }
        // }

        // const copy_g = JSON.parse(JSON.stringify(g));  // 深拷贝地图
        // if (!this.check_connectivity(copy_g, this.rows - 2, 1, 1, this.cols - 2))  // 检查连通性
        //     return false;

        // 将墙添加到walls数组中
        for (let r = 0; r < this.rows; r ++ ) {
            for (let c = 0; c < this.cols; c ++ ) {
                if (g[r][c]) {
                    this.walls.push(new Wall(r, c, this));  // 创建墙对象
                }
            }
        }

        return true;
    }

    // 添加键盘事件监听
    add_listening_events(){
        //判断一下是否是对局回放
        if(this.store.state.record.is_record){
            let k = 0;
            const a_steps = this.store.state.record.a_steps;
            const b_steps = this.store.state.record.b_steps;
            const loser = this.store.state.record.record_loser;
            const [snake0,snake1] = this.snakes;
            const interval_id = setInterval(()=>{
                if(k >= a_steps.length - 1){
                    if (loser === "all" || loser === "A") {
                        snake0.status = "die";
                    }
                    if (loser === "all" || loser === "B") {
                        snake1.status = "die";
                    }
                    clearInterval(interval_id);
                }else{
                    snake0.set_direction(parseInt(a_steps[k]));
                    snake1.set_direction(parseInt(b_steps[k]));
                }
                k++;
            },300);
        }else{
            this.ctx.canvas.focus();

            this.ctx.canvas.addEventListener("keydown",(e)=>{
                let d = -1;
                if (e.key === 'w') d = 0;  // 蛇1向上
                else if (e.key === 'd') d = 1;  // 蛇1向右
                else if (e.key === 's') d = 2;  // 蛇1向下
                else if (e.key === 'a') d = 3;  // 蛇1向左

                if(d >= 0){
                    this.store.state.pk.socket.send(JSON.stringify({
                        event: "move",
                        direction: d,
                    }))
                }
            });
        }
    }

    start() {
        // for (let i = 0; i < 1000; i ++ ) 
        //     if (this.create_walls())  // 尝试创建墙，直到成功
        //         break;
        this.create_walls();
        this.add_listening_events();  // 添加事件监听
    }

    // 更新地图大小
    update_size() {
        this.L = parseInt(Math.min(this.parent.clientWidth / this.cols, this.parent.clientHeight / this.rows));  // 计算每个格子的大小
        this.ctx.canvas.width = this.L * this.cols;  // 设置画布宽度
        this.ctx.canvas.height = this.L * this.rows;  // 设置画布高度
    }

    // 检查两条蛇是否都准备好下一回合
    check_ready(){
        for(const snake of this.snakes){
          if(snake.status!=="idle")return false;  // 如果蛇的状态不是idle，返回false
          if(snake.direction===-1)return false;  // 如果蛇的方向未设置，返回false
        }
        return true;
    }

    // 让两条蛇进入下一回合
    next_step(){
        for(const snake of this.snakes){
            snake.next_step();  // 每条蛇进入下一回合
        }
    }

    // 检测目标位置是否合法
    check_valid(cell){
        for(const wall of this.walls){
            if(wall.r===cell.r&&wall.c===cell.c)return false;  // 如果目标位置有墙，返回false
        }
        for(const snake of this.snakes){
            let k=snake.cells.length;
            if(!snake.check_tail_increasing()){
                k--;
            }
            for(let i=0;i<k;i++){
                if(snake.cells[i].r===cell.r&&snake.cells[i].c===cell.c)return false;  // 如果目标位置有蛇的身体，返回false
            }
        }
        return true;
    }

    // 更新游戏状态
    update() {
        this.update_size();  // 更新地图大小

        if(this.check_ready()){
            this.next_step();  // 如果两条蛇都准备好，进入下一回合
        }

        this.render();  // 渲染地图
    }

    // 渲染地图
    render() {
        const color_even = "#AAD751", color_odd = "#A2D149";  // 地图的两种颜色
        for (let r = 0; r < this.rows; r ++ ) {
            for (let c = 0; c < this.cols; c ++ ) {
                if ((r + c) % 2 == 0) {
                    this.ctx.fillStyle = color_even;  // 偶数格子颜色
                } else {
                    this.ctx.fillStyle = color_odd;  // 奇数格子颜色
                }
                this.ctx.fillRect(c * this.L, r * this.L, this.L, this.L);  // 绘制格子
            }
        }
    }
}